﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OWLServer.owl.tipos
{
    /// <summary>
    /// Clase que representa un individuo en una ontología.
    /// </summary>
    public class Individuo : ElementoRestringido
    {
        private IList<Clase> tipos;
        private IList<PropiedadDatoIndividuo> propiedadesDatos;
        private IList<PropiedadObjetoIndividuo> propiedadesObjetos;
        private IList<Individuo> iguales;
        private IList<Individuo> diferentes;

        /// <summary>
        /// Tipos de clases de las que es el individuo
        /// </summary>
        public virtual IList<Clase> Tipos
        {
            get { return tipos; }
            set { tipos = value; }
        }

        /// <summary>
        /// Propiedades de tipo dato que tiene el individuo
        /// </summary>
        public virtual IList<PropiedadDatoIndividuo> PropiedadesDatos
        {
            get { return propiedadesDatos; }
            set { propiedadesDatos = value; }
        }

        /// <summary>
        /// Propiedades de tipo objeto que tiene el individuo
        /// </summary>
        public virtual IList<PropiedadObjetoIndividuo> PropiedadesObjetos
        {
            get { return propiedadesObjetos; }
            set { propiedadesObjetos = value; }
        }

        /// <summary>
        /// Individuos iguales es este individuo
        /// </summary>
        public virtual IList<Individuo> Iguales
        {
            get { return iguales; }
            set { iguales = value; }
        }

        /// <summary>
        /// Individuos diferentes es este individuo
        /// </summary>
        public virtual IList<Individuo> Diferentes
        {
            get { return diferentes; }
            set { diferentes = value; }
        }

        public Individuo() { }

        public Individuo(string id) : base(id)
        {
            inicializarListas();
        }

        public Individuo(Elemento elemento)
            : base(elemento)
        {
            inicializarListas();
        }

        /// <summary>
        /// Inicializa las listas de elementos
        /// </summary>
        private void inicializarListas()
        {
            Tipos = new List<Clase>();
            Iguales = new List<Individuo>();
            Diferentes = new List<Individuo>();
            PropiedadesDatos = new List<PropiedadDatoIndividuo>();
            PropiedadesObjetos = new List<PropiedadObjetoIndividuo>();
        }
    }
}
